package main

import (
	"fmt"
)

type address struct {
	province string
	city     string
}

func (addr address) String() string {
	return fmt.Sprintf("addr: %s %s", addr.province, addr.city)
}

func printString(s fmt.Stringer) {
	fmt.Println(s.String())
}

type person struct {
	name string
	age  int
}

func modifyPerson(p person) {
	fmt.Printf("modifyPerson函数，p的内存地址位%p\n", &p)
	p.name = "李四"
	p.age = 20
}

func modifyPerson2(p *person) {
	fmt.Printf("modifyPerson函数，p的内存地址位%p\n", p)
	p.name = "李四"
	p.age = 20
}

// 指针修改参数
// func modifyPerson(p *person) {
// 	p.name = "李四"
// 	p.age = 20
// }

func main() {
	// add:=address{province:"四川",city:"成都"}
	// printString(add)
	// printString(&add)

	// var si fmt.Stringer=address{province:"上海",city:"上海"}
	// printString(si)
	// 虽然指向具体类型的指针可以实现一个接口，但是指向接口的指针永远不可能实现该接口。
	// sip:=&si
	// printString(sip)

	// p := person{name: "张三", age: 18}
	// modifyPerson(&p)
	// fmt.Println("person name",p.name,",age",p.age)

	// p:=person{name:"张三",age:18}
	// fmt.Printf("p的内存地址位%p\n",&p)
	// modifyPerson(p)
	// fmt.Println("person name:",p.name,",age",p.age)

	// p:=person{name:"张三",age:18}
	// fmt.Printf("p的内存地址位%p\n",&p)
	// modifyPerson2(&p)
	// fmt.Println("person name:",p.name,",age",p.age)

	// map makemap 函数返回的是一个 *hmap 类型 返回的是一个指针 chan 和map也一样本质是指针
	m := make(map[string]int)
	m["擦撒达娃"] = 18
	fmt.Println("age:", m["擦撒达娃"])
	modifyMap(m)
	fmt.Println("age:", m["擦撒达娃"])
	fmt.Printf("modifyMap函数：p的内存地址为%p\n", m)
}

func modifyMap(p map[string]int) {
	fmt.Printf("modifyMap函数：p的内存地址为%p\n", p)
	p["擦撒达娃"] = 20
}
